<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>

    /*
        [[Get]]：
            1.在对象中查找是否具有相同名称的属性，如果找到，就会返回这个属性的值。
            2.如果没有找到则遍历原型链
            3.无论·如何都没找到，返回undefined
    */

    /*
        [[Put]]：代表的属性设置的算法

        obj.a="a";
        [[put]]：
            1.如果属性直接存在于对象中　不在原型链上
                找到直接存在于对象中的属性
                    没有setter/getter
                        直接修改对象中的属性(注意writbale的值)
                    有setter/getter
                        直接调用set方法

             2.如果属性不直接存在于对象中也不在原型链上
                在对象的直接属性中添加一个属性
                        value:"a"
                        writable:true
                        configurable:true
                        enumerable:true

             3.如果属性直接存在于对象中  也在原型链上
                找到直接存在于对象中的属性
                没有setter/getter
                    直接修改对象中的属性(注意writbale的值)
                有setter/getter
                    直接调用set方法



            4.如果属性不直接存在于对象中  在原型链上
                 ①.原型链上属性没有setter/getter
                    -writbale为true
                        直接在对象中添加一个属性，我们称之为屏蔽属性
                    -writbale为false
                        严格模式下报错，不会生成屏蔽属性

                     ②.该属性有setter/getter
                        调用set，不会生成屏蔽属性
    */

    "use strict"
    // Object.prototype.a = "prototype-a"
    Object.defineProperty(Object.prototype,"a",{
        /*writable:false,
        value:"prototype-a",*/
        configurable:true,
        enumerable:true,
        get(){},
        set(val){}
    })

    var obj = {};
    obj.a = "a"
    console.log(obj);

</script>
</html>